package com.qiyue.utils;

import com.qiyue.pojo.Myfile;
import org.springframework.stereotype.Component;
import org.springframework.util.ResourceUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.*;

@Component
public class FileUtil {

    //使用set集合来存日期格式
    private static Set<String> dirSet = new HashSet<>();

    FileInputStream fis = null;
    BufferedInputStream bis = null;

    /**
     * 文件上传
     * @param file
     * @return
     * @throws IOException
     */
    public Myfile uploadFile(MultipartFile file) throws IOException {
        //封装文件信息
        Myfile myfile = new Myfile();
        myfile.setFilename(file.getOriginalFilename());//原始文件名
        myfile.setFilesize(file.getSize());//文件大小，使用long型
        myfile.setFiletype(StringUtils.getFilenameExtension(file.getOriginalFilename()));//获取文件后缀即类型
        myfile.setCreatetime(new Date());//创建时间
        // uuid 生成存入文件名
        String uuid = String.valueOf(UUID.randomUUID());
        //按照yyyyMMdd生成目录名称
        SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");
        String dir = df.format(new Date());

        //将本天的目录存放
        dirSet.add(dir);


        // 根路径，在 resources/static/my_file下面，如果判断返回的地址，如果没有就创建一个目录
        String basePath = ResourceUtils.getURL("classpath:").getPath() + "static/my_file/" + dir +"/";
        // 新的文件名，使用uuid生成文件名
        String newFileName = uuid + "."+StringUtils.getFilenameExtension(file.getOriginalFilename());
        // 创建新的文件夹
        File fileExist = new File(basePath);
        // 文件夹不存在，则新建
        if (!fileExist.exists()) {
            fileExist.mkdirs();
        }
        // 获取文件对象
        File newfile = new File(basePath, newFileName);
        // 完成文件的上传
        file.transferTo(newfile);
        myfile.setFileroot(basePath+newFileName);//文件目录地址
        myfile.setUuid(uuid);
        return myfile;
    }

    /**
     * 文件下载
     */
    public Boolean download(HttpServletResponse response ,String fileName) throws FileNotFoundException {
        //文件地址
        //按照yyyyMMdd生成目录名称,遍历文件目录
        File nfile = null;

        List<String> dirList = new ArrayList<>();
        Iterator<String> iterator = dirSet.iterator();
        while (iterator.hasNext()){
            String dir = iterator.next();//目录日期
            dirList.add(dir);
        }

        for (String dir01 : dirList) {
            String basePath =  ResourceUtils.getURL("classpath:").getPath() + "static/my_file/" + dir01 +"/"+fileName;
            File file = new File(basePath);
            if (file!=null){
                nfile = file;
                break;
            }
        }


        byte[] buffer = new byte[1024];
        try {
            fis = new FileInputStream(nfile);
            bis = new BufferedInputStream(fis);
            OutputStream os = response.getOutputStream();
            int i = bis.read(buffer);
            while (i != -1) {
                os.write(buffer, 0, i);
                i = bis.read(buffer);
            }
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            // 做关闭操作
            if (bis != null) {
                try {
                    bis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return false;
    }

}
